#ifndef HEAD_H
#define HEAD_H
/*---------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <fcntl.h>  
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <mysql/mysql.h>
#include <sys/mman.h>
#include <sys/sendfile.h>
/*---------------------------------------------------------*/


//已连接的客户端信息
typedef struct client_info_s{
    int net_fd;
    char virtual_global_path[1024];
    char global_path[1024];
}client_info_t;

//通信所用的载体
typedef struct train_s{
    int len;
    char data[1024];
}train_t;

// 对命令行参数的个数进行校验
#define ARGS_CHECK(argc, expected) \
    do { \
        if ((argc) != (expected)) { \
            fprintf(stderr, "args error!\n"); \
            exit(1); \
        } \
    } while (0)

// 对函数的返回值进行错误处理
#define ERROR_CHECK(ret, error_flag, msg) \
    do{ \
        if((ret) == (error_flag)){ \
            perror((msg)); \
            exit(1); \
        } \
    }while(0)

// 对线程函数的返回值进行错误处理
#define THREAD_ERROR_CHECK(ret,msg) { \
    if(ret!=0){ \
        fprintf(stderr,"%s:%s\n",msg,strerror(ret)); \
    } \
}

#endif